package mysql8学习.高级.第10章_索引优化与查询优化;

/**
 * filesort 算法:双路排序和单路排序
 *
 * 双路排序(慢)
 * ●MySQL 4.1之前是使用双路排序，字面意思就是两次扫描磁盘,最终得到数据，读取行指针和order by列,
 *  对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出
 * ●从磁盘取排序字段，在buffer进行排序, 再从磁盘取其他字段。
 *  取一批数据，要对磁盘进行两次扫描，众所周知，I/O是很耗时的，所以在mysql4.1之后，
 *  出现了第二种改进的算法，就是单路排序。
 *
 * 单路排序(快)  直接把order by列全部取出来，之后在进行排序  不需要第二次扫描 ，但对缓存要求高
 * 从磁盘读取查询需要的所有列，按照order by列在buffer对它们进行排序，然后扫描排序后的列表进行输出，
 * 它的效率更快一些, 避免了第二次读取数据。
 * 并且把随机 IO 变成了顺序IO,但是它会使用更多的空间，因为它把每一行都保存在内存中了。
 *
 *
 * 结论及引申出的问题
 * ●由于单路是后出的，总体而言好过双路
 * ●但是用单路有问题
 *  。在sort_buffer中， 单路比多路要多占用很多空间，因为单路是把所有字段都取出，所以有可能取出的数据的
 *  总大小超出了sort_buffer的容量，导致每次只能取sort_buffer容量大小的数据，
 *  进行排序(创建tmp文件，多路合并)，排完再取 sort_buffer 容量大小，再排.... 从而多次I/O。
 *  单路本来想省一次I/O操作, 反而导致了大量的I/O操作 ，反而得不偿失。
 *
 *  优化策略
 * 1.尝试提高 sort_buffer_size
 *   InnoDB存储引擎默认值是1048576字节，1MB。
 * 2.尝试提高 max_length_forsort_data
 *   ●提高这个参数，会增加用改进算法的概率。
 *   SHOW VARIABLES LIKE '%max_length_for_sort_data%';#默认1024字节
 *   ●但是如果设的太高，数据总容量超出sort_buffer_size的概率就增大,
 *   明显症状是高的磁盘I/O活动和低的处理器使用率。
 *   如果需要返回的列的总长度大于 max_length_for_sort_data, 使用双路算法，否则使用单路算法。
 *   1024-8192 字节之间调整
 * 3. Order by时select*是一个大忌。最好只 Query 需要的字段。原因:
 *   ●当Query的字段大小总和小于max_length_for_sort_data，而且排序字段不是TEXT|BLOB类型时，
 *   会用改进后的算法 ：单路排序， 否则用老算法 ： 多路排序。
 *   ●两种算法的数据都有可能超出sort_buffer_size的容量,超出之后，会创建tmp文件进行合并排序，
 *   导致多次I/O,但是用单路排序算法的风险会更大一些， 所以要提高sort_buffer_size 。
 *
 *
 */
public class E4_filesort算法 {
}
